<?php
namespace app\zhongkl_forum\controller;
use think\facade\Db;
use think\facade\Filesystem;
use PhpOffice\PhpSpreadsheet\IOFactory;
// use think\facade\route;
class Index 
{   
    use \liliuwei\think\Jump;
    //  1类方法，检查用户登录状态
    public function check()
    {
        // 如果没有登录，就做出限制
        if (!session('?uNick')){
            $this->error("请登录后再访问该功能！","user/login");
        }
    }
    public function showSec()
    {
        // 查询帖子列表
        $sec = DB::table('zhongkl_section')
            ->field('s_name,s_id')
            ->select();
            return $sec;
    }
    public function checkMid($mid){
        // 检查没有mid的情况 1803010144
        if($mid == -1){
            $this.error("操作有误","index/index");
            exit();
        }
        // 检查mid是否合法
        $mesYes = DB::name("mes")
            ->where("m_id",$mid)
            ->field("m_id")
            ->find();
        if($mesYes == null){
            // mid不合法
            $this->error("操作有误","index/index");
            exit();
        }
    }
    public function checkSid($sid){
        // 检查sid存在情况
        if($sid == -1 ){
            $this.error("操作有误",'index/index');
            exit();
        }
        // 检查sid合法性
        $sidYes = DB::name("section")
            ->where("s_id",$sid)
            ->field("s_id")
            ->find();
        if($sidYes == null && $sid !== 0){
            $this->error("操作有误","index/index");
            exit();
        }
    }
    //2类方法，渲染门户页面 1803010144
    public function index()
    {   
        // $post = $_POST;
        // // var_dump($post);
        // // echo "<br>";
        
        // foreach($post as $key => $a){
        //     // print_r($key."的值是");
        //     // print_r($a);
        //     $b = implode('',input($key));
        //     $post[$key] = $b ;
        //     // print_r($key."的值是".$b);
        //     // echo"<br>";
        // }
        // var_dump($post);

        /*
            测试phpspreadsheet读取excel
            1、获取文件的后缀
            2、根据不同的后缀加载不同的excel读取引擎
            3、定位工作表
            4、读取行和列记录构造数据入库的数组
            5、数据批量插入数据库
            路径：D:\AppServ\www\1803010144\public\upload\工作簿1.xlsx
        */
        $fileName = "upload\工作簿1.xlsx";
        $ext = substr($fileName,strripos($fileName,'.'));
         
        if($ext == '.xlsx'){
            // 加载excel 2007 文件引擎
            $reader = IOFactory::createReader('Xlsx');
            $reader->setReadDataOnly(true);
            $spreadSheet = $reader->load($fileName);
            $workSheet = $spreadSheet->getActiveSheet();
            $datasheet = [];
            foreach($workSheet->getRowIterator() as $key =>$row){
                if($key > 1){
                    $cellIterator = $row->getCellIterator();
                    $cellIterator->setIterateOnlyExistingCells(false);
                    foreach($cellIterator as $k => $cell){
                        echo $k;
                        $datasheet[$key][$k]=$cell->getValue();
                    }
                } 
                
            }
            // print_r($datasheet);
            // $NUM = Db::connect("mysql123")
            //     ->table('test')
            //     ->insertAll($datasheet);
            // echo $NUM;
        }elseif($ext == '.xls'){
            // 加载excel 2003文件引擎
        }else{
            $this->error("你要加载的文件格式识别失败");
        }




        $sec = $this -> showSec();
        return view('',['sec'=>$sec]);
    }
    // 2类方法，渲染显示板块帖子列表页
    public function view($sid = 0)
    {
        // 每页查询数量$select
        $select = input("select")?:10;
        $sid = input("sid")?:0;
        // 检查$sid的合法性
        $this->checkSid($sid);
        if($sid == 0){
            // 加载全部的帖子，查询全部的帖子列表
            $mes = DB::view('mes','s_id,m_title,u_nick,m_createat,m_id')
                ->view('user','u_img','mes.u_nick = user.u_nick')
                ->order("m_createat","desc");
            $selectName = "全部";
        }
        else{
            // 查询$sid的贴子 1803010144
            $mes = DB::view('mes','s_id,m_title,u_nick,m_createat,m_id')
                ->view('user','u_img','mes.u_nick = user.u_nick')
                ->where('s_id',$sid)
                ->order("m_createat","desc");
                // ->select();
            $selected = DB::name('section','s_name')
                ->where('s_id',$sid)
                ->find();
            $selectName =$selected['s_name'];
        }
        $mes = $mes ->paginate([
                'list_rows' => $select,
                'query' => request()->param(),
            ]);
        $sec = $this -> showSec();
        // 总回帖数量 1803010144
        $mes_length = $mes->total();
        return view('',['mes' => $mes,'sec' => $sec,'select' => $select,'sid' => $sid,'selectName' => $selectName,'mes_length' =>$mes_length]);
    }
    
    // 2类方法，渲染发帖页面 1803010144
    public function post() 
    {   
        $sid = input("sid");
        // print_r($sid);
        $this->checkSid($sid);
        $this->check();
        // echo ($sid);
        $allName = DB::name('section')
            ->field('s_name,s_id')
            ->select();
        // print_r($allName);
        $sname = DB::name('section')
            ->where('s_id',$sid)
            ->field('s_name')
            ->find();
        $sec = $this -> showSec();
        
        // print_r($sec);
        return view('',['sec'=>$sec,'sid' => $sid,'sname' => $sname,'allName' => $allName]);
    }
    public function doScore(){
        echo 1;
        $this->success('总算跳到了','Answer/score');
    }
    // 1类方法，处理用户发帖信息，执行发帖 1803010144
    public function doPost()
    {
        $this->check();
        // 准备写入帖子的信息 
        $mes = [
            'm_title' => input('mtitle'),
            'm_content' => input('mcontent'),
            'u_nick' => session('uNick'),
            'm_createat' => time(),
            's_id' => input('tzsid')
        ];
        // 写入帖子 1803010144
        $mesPost = Db::connect("mysql123")
            ->table('zhongkl_mes')
            ->insert($mes);
        // 判断是否写入成功
        if($mesPost == 1)
        {
            // 成功
            // $this->redirect('index/view',['sid' => input('tzsid')], 302,'');
            $this->success('发帖成功',url('index/view',['sid' => input('tzsid')]),'',3);
        }
        else{
            // 失败
            $this->error("发帖失败!");
        }
    }
     // 2类方法，渲染显示帖子详细信息页面
     public function detail($mid = -1)
    {
        // 获得$select每页打印回复贴的数量或自定义为5
        $select = input("select")?:5;
        // 获得当前查看回复贴的页码
        $pageNull = input("page")?:1;
        $this->checkMid($mid);
        // 查询mes、user、section 条件mes.u_nick = user.u_nick、mes.s_id = section.s_id
        // input("mid")
        $mes = Db::view('mes','m_id,m_title,m_content,u_nick,m_createat')
            ->view('user','u_img','mes.u_nick = user.u_nick')
            ->view('section','s_name','mes.s_id = section.s_id')
            ->where("m_id",$mid)
            ->find();
        // 查询回复用户的u_img,u_nick,r_content,_r_createat list_rows 根据$select查询
        $res = DB::view('res','r_content,u_nick,r_createat')
            ->view('user','u_img','res.u_nick = user.u_nick')
            ->where('m_id',$mid)
            ->paginate([
                'list_rows' => $select,
                'query' => request()->param(),
            ]);
        $res_length = $res->total();
        $sec = $this -> showSec();
        // $page = $res->render();
        return view("",['mes'=>$mes,'sec'=>$sec,'res' => $res,'res_length' => $res_length,'select' => $select,'pageNull' => $pageNull]);
    }
    // 1类方法，处理用户回复帖子信息，执行回复帖子 1803010144
    public function doRes($mid = -1)
    {
        // 检查是否登录
        $this ->check();
        // 检查$mid 
        $this->checkMid($mid);
        $res = [
            'r_content' => input('rcontent'),
            'u_nick' => session('uNick'),
            'r_createat' => time(),
            'm_id' => $mid
        ];
        // print_r($res['r_content']);
        $resUpate = DB::connect("mysql123")
                ->name("res")
                ->insert($res);
        // echo 1;
        // return;
        if($resUpate == 1){
            $this->success('评论成功');
        }
        else{
            exit();
        }

    } 

    //  2类方法，渲染修改用户密码界面
     public function changePa()
    {
        $sec = $this-> showSec();
        return view('',['sec' => $sec]);
    }
    //  1类方法，处理用户修改密码操作，执行修改用户密码
    public function doChangePa()
    {   
        // 当用户上传修改密码表单到这时，利用用户上传的用户名提取旧密码
        $oldPa = Db::connect('mysql')
            ->name('user')
            ->where('u_nick',input('nick'))
            ->field('u_pa')
            ->find();
        $newPa = md5(input('newPa'));
        $oldPa = $oldPa['u_pa'];
        // return;
        // 判断数据库密码和输入的密码是否一致
        if($oldPa == md5(input('pa'))){
            if($oldPa !== $newPa){
                 // 运用具有更新权限的方案进行更新
            $paUpdate = DB::connect("mysql123")
                ->name('user')
                ->where('u_nick',input('nick'))
                ->update(['u_pa' => $newPa]);
                if($paUpdate != null){
                    $this->logOut();
                }
                else{
                    $this->error('密码修改失败');
                }
            }else{
                $this->error('你所修改的密码不能和原密码一致');
            }
           
        }else{
            $this->error('请输入正确的旧密码');
        }
        
            
           
    } 
    //  2类方法，渲染上传头像界面 1803010144
    public function me()
    {   
        $this->check();
        $sec = $this -> showSec();
        return view('',['sec'=>$sec]);
    }
    //  1类方法，处理用户上传头像信息，执行上传头像
    public function upMe()
    {   
        $this->check();
        // 获得旧头像名
        $oldFile = $meUpdate = DB::connect("mysql")
                ->table("zhongkl_user")
                ->where('u_nick',session("uNick"))
                ->field('u_img')
                ->find();
        // 获得表单上传文件 1803010144
        $file = request()->file("image");
        // 判断文件大小和类型
        try {
            validate(['file' => ['fileSize:102400', 'fileExt:jpg,png,gif']])
                ->check(['file' => $file]);
        } catch (\think\exception\ValidateException $e) {
            $return['msg'] = $e->getMessage();
            // return json($return);
            $this->error($return['msg']);
        }
        // echo $file;
        // 上传到本地服务器
        $saveName = Filesystem::disk('public')->putFile('upload',$file);
        // echo $saveName;
        // 存入字段的图片信息 用subster截取文件名字字段 1803010144
        $fileInfo = substr($saveName,7);
        // echo $oldFile["u_img"]."<br>";
        // 完整的图片路径信息
        $fileName = app()->getRootPath() . 'public/static/zhongkl_forum/'.$saveName;
        // echo $fileName."<br>";
        // 完整的旧图片路径
        $oldfileName = app()->getRootPath() . 'public/static/zhongkl_forum/upload/'.$oldFile["u_img"];
        // echo $oldfileName;
        // return;
        if(file_exists($fileName)){
            try{
                // 判断旧头像是否是初始头像
                // 不是，则删除
                if ($oldFile["u_img"] !== "default.jpg"){
                    unlink($oldfileName);
                    echo "成功";
             }
            }catch(\Exception $e){
                echo "这是初始图片";
            }
            
            // 上传成功 1803010144 
            $meUpdate = DB::connect("mysql123")
                ->table("zhongkl_user")
                ->where('u_nick',session("uNick"))
                ->update(["u_img" => $fileInfo]);
            if($meUpdate == 1){
                // 更新成功 
                session('uImg',null);
                session('uImg',$fileInfo);
                $this->success("更新成功！","index/index");
                
            }
            else{
                // 更新失败
                $this->error("更新失败！","index/index");
                // exit();
            }
        }
        else{
            // 上传失败
            $this->error("上传图片失败！","index/index");
            // exit();
        }

        
    } 
    //  1类方法，处理用户注销账号信息，执行注销
    public function logOut()
    {
        $this->check();
        // 清除session变量的值
        session("uNick",null);
        session("uImg",null);
        $this->success("注销成功!","user/login");
    } 
    
    // 存放个人信息以及修改个人信息
    public function users()
    {
        $sec = $this -> showSec();
        return view('',['sec'=>$sec]);
    }
    public function exam(){
        // $mes = DB::table('zhongkl_paper')
        //     ->whereTime('p_time',['2021-1-1','2021-2-1'])
        //     ->select();
        // var_dump($mes);
    }
}
